package edu.ptu.shortlink.project.common.convention.exception;


import edu.ptu.shortlink.project.common.convention.errorcode.IErrorCode;
import lombok.Getter;
import org.springframework.util.StringUtils;

import java.util.Optional;

/**
 * @BelongsProject: shortlink
 * @BelongsPackage: edu.ptu.shortlink.admin.common.convention.exception
 * @Author: HYJ
 * @CreateTime: 2025-04-23  17:17
 * @Description: 将项目中的三类异常体系抽象出来:统一处理 客户端异常,服务端异常,远程调用异常
 * @see ClientException
 * @see ServiceException
 * @see RemoteException
 */
@Getter
public abstract class AbstractException extends RuntimeException {

    // 标识具体的错误类型
    public final String errorCode;

    // 描述错误的详细信息
    public final String errorMessage;


    /**
     * 构造抽象异常实例
     *
     * @param message   异常描述信息，将传递给父类RuntimeException
     * @param throwable 异常原因，将传递给父类RuntimeException
     * @param errorCode 错误码接口实例，用于获取具体的错误码和错误信息
     */
    public AbstractException(String message, Throwable throwable, IErrorCode errorCode) {
        //  调用父类的构造方法,传递异常描述信息和异常原因
        super(message, throwable);

        this.errorCode = errorCode.code();
        // 如果提供的错误消息不为空，则使用提供的消息，否则使用错误码的默认消息
        this.errorMessage = Optional.ofNullable(
                        StringUtils.hasLength(message) ? message : null)
                .orElse(errorCode.message());
    }
}
